package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.school.sports.entity.Report;
import com.school.sports.entity.dto.StatisticsDTO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 统计报表服务接口
 * 提供各类数据的统计分析和报表生成功能
 */
public interface StatisticsService {

    // ==================== 报名统计功能 ====================

    /**
     * 获取报名统计数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param filters 过滤条件
     * @return 报名统计数据
     */
    StatisticsDTO.EnrollmentStatisticsDTO getEnrollmentStatistics(LocalDateTime startTime, LocalDateTime endTime, Map<String, Object> filters);

    /**
     * 获取报名趋势数据
     * @param days 统计天数
     * @return 报名趋势数据
     */
    List<StatisticsDTO.TimeSeriesDataDTO> getEnrollmentTrend(Integer days);

    /**
     * 获取项目报名排行榜
     * @param limit 排行榜数量限制
     * @return 项目报名排行
     */
    List<StatisticsDTO.RankingDataDTO> getProjectEnrollmentRanking(Integer limit);

    /**
     * 获取学院报名分布统计
     * @param filters 过滤条件
     * @return 学院报名分布
     */
    Map<String, Object> getEnrollmentDistributionByCollege(Map<String, Object> filters);

    // ==================== 成绩统计功能 ====================

    /**
     * 获取成绩统计数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param filters 过滤条件
     * @return 成绩统计数据
     */
    StatisticsDTO.ScoreStatisticsDTO getScoreStatistics(LocalDateTime startTime, LocalDateTime endTime, Map<String, Object> filters);

    /**
     * 获取成绩分布统计
     * @param projectId 项目ID
     * @return 成绩分布数据
     */
    Map<String, Object> getScoreDistribution(Long projectId);

    /**
     * 获取项目平均成绩统计
     * @param filters 过滤条件
     * @return 项目平均成绩
     */
    Map<String, Double> getAverageScoresByProject(Map<String, Object> filters);

    /**
     * 获取优秀成绩榜单
     * @param projectId 项目ID
     * @param limit 榜单数量限制
     * @return 优秀成绩榜单
     */
    List<StatisticsDTO.RankingDataDTO> getTopPerformers(Long projectId, Integer limit);

    // ==================== 项目统计功能 ====================

    /**
     * 获取项目统计数据
     * @param filters 过滤条件
     * @return 项目统计数据
     */
    StatisticsDTO.ProjectStatisticsDTO getProjectStatistics(Map<String, Object> filters);

    /**
     * 获取项目类型分布
     * @return 项目类型分布
     */
    Map<String, Long> getProjectTypeDistribution();

    /**
     * 获取项目参与度统计
     * @param filters 过滤条件
     * @return 项目参与度数据
     */
    List<Map<String, Object>> getProjectParticipationRate(Map<String, Object> filters);

    /**
     * 获取项目热度排行榜
     * @param limit 排行榜数量限制
     * @return 项目热度排行
     */
    List<StatisticsDTO.RankingDataDTO> getProjectPopularityRanking(Integer limit);

    // ==================== 用户统计功能 ====================

    /**
     * 获取用户统计数据
     * @param filters 过滤条件
     * @return 用户统计数据
     */
    StatisticsDTO.UserStatisticsDTO getUserStatistics(Map<String, Object> filters);

    /**
     * 获取用户角色分布
     * @return 用户角色分布
     */
    Map<String, Long> getUserRoleDistribution();

    /**
     * 获取用户注册趋势
     * @param days 统计天数
     * @return 用户注册趋势
     */
    List<StatisticsDTO.TimeSeriesDataDTO> getUserRegistrationTrend(Integer days);

    /**
     * 获取学院用户分布
     * @return 学院用户分布
     */
    Map<String, Long> getUserDistributionByCollege();

    // ==================== 志愿者统计功能 ====================

    /**
     * 获取志愿者统计数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param filters 过滤条件
     * @return 志愿者统计数据
     */
    StatisticsDTO.VolunteerStatisticsDTO getVolunteerStatistics(LocalDateTime startTime, LocalDateTime endTime, Map<String, Object> filters);

    /**
     * 获取志愿者服务时长统计
     * @param days 统计天数
     * @return 服务时长统计
     */
    List<StatisticsDTO.TimeSeriesDataDTO> getVolunteerServiceHoursTrend(Integer days);

    /**
     * 获取志愿者服务排行榜
     * @param limit 排行榜数量限制
     * @return 志愿者服务排行
     */
    List<StatisticsDTO.RankingDataDTO> getVolunteerServiceRanking(Integer limit);

    /**
     * 获取志愿者部门分布
     * @return 志愿者部门分布
     */
    Map<String, Long> getVolunteerDistributionByDepartment();

    // ==================== 裁判统计功能 ====================

    /**
     * 获取裁判统计数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param filters 过滤条件
     * @return 裁判统计数据
     */
    StatisticsDTO.RefereeStatisticsDTO getRefereeStatistics(LocalDateTime startTime, LocalDateTime endTime, Map<String, Object> filters);

    /**
     * 获取裁判工作量统计
     * @param filters 过滤条件
     * @return 裁判工作量数据
     */
    List<Map<String, Object>> getRefereeWorkloadStatistics(Map<String, Object> filters);

    /**
     * 获取裁判专业分布
     * @return 裁判专业分布
     */
    Map<String, Long> getRefereeDistributionBySpecialty();

    /**
     * 获取裁判等级分布
     * @return 裁判等级分布
     */
    Map<String, Long> getRefereeDistributionByLevel();

    // ==================== 奖牌统计功能 ====================

    /**
     * 获取奖牌统计数据
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param filters 过滤条件
     * @return 奖牌统计数据
     */
    StatisticsDTO.MedalStatisticsDTO getMedalStatistics(LocalDateTime startTime, LocalDateTime endTime, Map<String, Object> filters);

    /**
     * 获取学院奖牌排行榜
     * @param filters 过滤条件
     * @return 学院奖牌排行
     */
    List<StatisticsDTO.RankingDataDTO> getCollegeMedalRanking(Map<String, Object> filters);

    /**
     * 获取班级奖牌排行榜
     * @param filters 过滤条件
     * @return 班级奖牌排行
     */
    List<StatisticsDTO.RankingDataDTO> getClassMedalRanking(Map<String, Object> filters);

    /**
     * 获取项目奖牌分布
     * @return 项目奖牌分布
     */
    Map<String, Map<String, Long>> getMedalDistributionByProject();

    // ==================== 总体统计功能 ====================

    /**
     * 获取总体统计数据
     * @param filters 过滤条件
     * @return 总体统计数据
     */
    StatisticsDTO.OverviewStatisticsDTO getOverviewStatistics(Map<String, Object> filters);

    /**
     * 获取运动会实时数据
     * @return 实时数据
     */
    Map<String, Object> getRealTimeStatistics();

    /**
     * 获取每日活动总结
     * @param days 统计天数
     * @return 每日活动数据
     */
    List<Map<String, Object>> getDailyActivitySummary(Integer days);

    /**
     * 获取参与率统计
     * @param filters 过滤条件
     * @return 参与率数据
     */
    Map<String, Double> getParticipationRates(Map<String, Object> filters);

    // ==================== 报表生成和管理 ====================

    /**
     * 生成统计报表
     * @param reportType 报表类型
     * @param reportName 报表名称
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param filters 过滤条件
     * @param generatedBy 生成者ID
     * @return 报表对象
     */
    Report generateReport(String reportType, String reportName, LocalDateTime startTime, LocalDateTime endTime, Map<String, Object> filters, Long generatedBy);

    /**
     * 异步生成报表
     * @param reportType 报表类型
     * @param reportName 报表名称
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param filters 过滤条件
     * @param generatedBy 生成者ID
     * @return 报表ID
     */
    Long generateReportAsync(String reportType, String reportName, LocalDateTime startTime, LocalDateTime endTime, Map<String, Object> filters, Long generatedBy);

    /**
     * 分页查询报表列表
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param filters 过滤条件
     * @return 报表分页数据
     */
    IPage<Report> getReportPage(Integer currentPage, Integer pageSize, Map<String, Object> filters);

    /**
     * 根据ID查询报表详情
     * @param reportId 报表ID
     * @return 报表详情
     */
    Report getReportById(Long reportId);

    /**
     * 更新报表状态
     * @param reportId 报表ID
     * @param status 新状态
     * @return 更新结果
     */
    boolean updateReportStatus(Long reportId, String status);

    /**
     * 删除报表
     * @param reportId 报表ID
     * @return 删除结果
     */
    boolean deleteReport(Long reportId);

    /**
     * 批量删除报表
     * @param reportIds 报表ID列表
     * @return 删除结果
     */
    boolean batchDeleteReports(List<Long> reportIds);

    /**
     * 刷新报表数据
     * @param reportId 报表ID
     * @return 刷新结果
     */
    boolean refreshReport(Long reportId);

    /**
     * 检查报表生成状态
     * @param reportId 报表ID
     * @return 生成状态
     */
    String checkReportGenerationStatus(Long reportId);

    // ==================== 报表导出功能 ====================

    /**
     * 导出报表为Excel
     * @param reportId 报表ID
     * @param config 导出配置
     * @return 文件路径
     */
    String exportReportToExcel(Long reportId, StatisticsDTO.ExportConfigDTO config);

    /**
     * 导出报表为PDF
     * @param reportId 报表ID
     * @param config 导出配置
     * @return 文件路径
     */
    String exportReportToPDF(Long reportId, StatisticsDTO.ExportConfigDTO config);

    /**
     * 导出报表为Word
     * @param reportId 报表ID
     * @param config 导出配置
     * @return 文件路径
     */
    String exportReportToWord(Long reportId, StatisticsDTO.ExportConfigDTO config);

    /**
     * 导出报表为CSV
     * @param reportId 报表ID
     * @param config 导出配置
     * @return 文件路径
     */
    String exportReportToCSV(Long reportId, StatisticsDTO.ExportConfigDTO config);

    // ==================== 图表数据生成功能 ====================

    /**
     * 生成图表配置
     * @param chartType 图表类型
     * @param data 数据
     * @param options 图表选项
     * @return 图表配置
     */
    StatisticsDTO.ChartConfigDTO generateChartConfig(String chartType, List<Map<String, Object>> data, Map<String, Object> options);

    /**
     * 获取仪表盘数据
     * @return 仪表盘数据
     */
    Map<String, Object> getDashboardData();

    /**
     * 获取实时图表数据
     * @param dataType 数据类型
     * @param timeRange 时间范围
     * @return 实时图表数据
     */
    List<Map<String, Object>> getRealTimeChartData(String dataType, String timeRange);

    // ==================== 数据缓存功能 ====================

    /**
     * 缓存统计数据
     * @param cacheKey 缓存键
     * @param data 统计数据
     * @param expireTime 过期时间（秒）
     */
    void cacheStatisticsData(String cacheKey, Object data, Long expireTime);

    /**
     * 获取缓存的统计数据
     * @param cacheKey 缓存键
     * @return 缓存的数据
     */
    Object getCachedStatisticsData(String cacheKey);

    /**
     * 清除统计数据缓存
     * @param cacheKey 缓存键
     */
    void clearStatisticsCache(String cacheKey);

    /**
     * 清除所有统计数据缓存
     */
    void clearAllStatisticsCache();

    // ==================== 数据分析功能 ====================

    /**
     * 获取数据趋势分析
     * @param dataType 数据类型
     * @param timeRange 时间范围
     * @return 趋势分析结果
     */
    Map<String, Object> getDataTrendAnalysis(String dataType, String timeRange);

    /**
     * 获取数据对比分析
     * @param currentPeriod 当前周期
     * @param previousPeriod 前一周期
     * @param dataType 数据类型
     * @return 对比分析结果
     */
    Map<String, Object> getDataComparisonAnalysis(Map<String, Object> currentPeriod, Map<String, Object> previousPeriod, String dataType);

    /**
     * 获取预测数据
     * @param dataType 数据类型
     * @param period 预测周期
     * @return 预测数据
     */
    List<StatisticsDTO.TimeSeriesDataDTO> getPredictionData(String dataType, Integer period);

    // ==================== 系统监控功能 ====================

    /**
     * 获取系统性能统计
     * @return 系统性能数据
     */
    Map<String, Object> getSystemPerformanceStatistics();

    /**
     * 获取数据质量报告
     * @return 数据质量报告
     */
    Map<String, Object> getDataQualityReport();

    /**
     * 获取异常数据报告
     * @return 异常数据报告
     */
    List<Map<String, Object>> getAbnormalDataReport();

    // ==================== 权限和安全功能 ====================

    /**
     * 检查用户是否有权限访问报表
     * @param userId 用户ID
     * @param reportId 报表ID
     * @return 是否有权限
     */
    boolean hasReportAccessPermission(Long userId, Long reportId);

    /**
     * 检查用户是否有权限生成报表
     * @param userId 用户ID
     * @param reportType 报表类型
     * @return 是否有权限
     */
    boolean hasReportGeneratePermission(Long userId, String reportType);

    /**
     * 记录报表访问日志
     * @param userId 用户ID
     * @param reportId 报表ID
     * @param action 操作类型
     */
    void logReportAccess(Long userId, Long reportId, String action);

    /**
     * 获取用户访问统计
     * @param userId 用户ID
     * @return 用户访问统计
     */
    Map<String, Object> getUserAccessStatistics(Long userId);
}